package com.gujiangbo.channel;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

/**
 * @Author: gujiangbo.co
 * @Contact: 646832012@qq.com
 * @Date: 2022/5/3 21:51
 * @Version: 1.0
 * @Description: Channel 其他方法解释说名
 */
public class JavaFileChannelMethodExplain {

    public static void main(String[] args) throws Exception {

        RandomAccessFile file = new RandomAccessFile("/Users/gujiangbo/Desktop/project/study-nio/src/main/resources/file.txt", "rw");
        // 创建数据通道Channel
        FileChannel channel = file.getChannel();
        /**
         * 有时可能需要在 FileChannel 的某个特定位置进行数据的读/写操作。
         * 可以通过调用 position()方法获取 FileChannel 的当前位置。
         * 也可以通过调用 position(long pos)方 法设置 FileChannel 的当前位置。
         * 这里有两个例子:
         * long pos = channel.position();
         * channel.position(pos +123);
         * 如果将位置设置在文件结束符之后，然后试图从文件通道中读取数据，读方法将返回- 1 （文件结束标志）。
         * 如果将位置设置在文件结束符之后，然后向通道中写数据，文件将撑大到当前位置并 写入数据。
         * 这可能导致“文件空洞”，磁盘上物理文件中写入的数据间有空隙。
         */
        channel.position(111);

        /**
         * 实例的 size()方法将返回该实例所关联文件的大小
         */
        channel.size();

        /**
         * 截取指定长度的文件,后面部分将被删除
         */
        channel.truncate(1024);

        /**
         * 法将通道里尚未写入磁盘的数据强制写到磁盘上。
         * 出于性能方 面的考虑，操作系统会将数据缓存在内存中，
         * 所以无法保证写入到 FileChannel 里的 数据一定会即时写到磁盘上。
         * 要保证这一点，需要调用 force()方法。
         */
        channel.force(true);
    }
}
